import mysql from 'mysql2/promise'

/**
 * @type {Promise<import('mysql2/promise').Connection>}
 */
let connection

/**
 * 连接到 MySQL 数据库。
 * @returns {Promise<void>}
 */
export async function connectToMySQL() {
  try {
    // 创建一个到 MySQL 数据库的连接
    connection = await mysql.createConnection({
      // 数据库主机地址
      host: 'rm-bp169ade557ds23d6wfrff.mysql.rds.aliyuncs.com',
      // 数据库用户名
      user: 'z1',
      // 数据库用户密码
      password: 'DaQFlm5V13n#Vyeff%IPib',
      // 要连接的数据库名称
      database: 'cts-z1',
    })
  } catch (error) {
    console.error('连接 MySQL 数据库时出错:', error)
    throw error
  }
}

/**
 * 获取 MySQL 数据库中的所有表名。
 * 此函数执行 SQL 查询，从 information_schema.TABLES 中获取当前数据库的所有表名。
 * @returns {Promise<string[]>}
 */
export async function getMySQLTables() {
  try {
    // 执行 SQL 查询，从 information_schema.TABLES 中获取当前数据库的所有表名
    const [rows] = await connection.execute('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?', [
      connection.config.database,
    ])
    // 从查询结果中提取表名
    const tableNames = rows.map(row => row.TABLE_NAME)
    // 返回包含所有表名的数组
    return tableNames
  } catch (error) {
    console.error('获取 MySQL 表名时出错:', error)
    throw error
  }
}

/**
 * 获取指定表的完整信息。
 * 此函数执行 SQL 查询，从 information_schema.COLUMNS 中获取指定表的列信息。
 * @param {string} tableName - 要获取信息的表名。
 * @returns {Promise<{ tableName: string, columns: any[] }>}
 */
export async function getTableFullInfo(tableName) {
  try {
    // 执行 SQL 查询，从 information_schema.COLUMNS 中获取指定表的列信息
    const [columns] = await connection.execute(
      'SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?',
      [connection.config.database, tableName],
    )
    // 创建一个包含表名和列信息的对象
    const tableInfo = {
      tableName,
      columns,
    }
    return tableInfo
  } catch (error) {
    console.error(`获取表 ${tableName} 的完整信息时出错:`, error)
    throw error
  }
}
